package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.Export;
import cn.itcast.domain.cargo.ExportProduct;
import cn.itcast.domain.cargo.ExportProductExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.BeanMapUtils;
import com.alibaba.dubbo.config.annotation.Reference;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletOutputStream;
import javax.sql.DataSource;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;

@Controller
@RequestMapping("/cargo/export")
public class PdfController extends BaseController {

    @Reference
    private ExportService exportService;
    @Reference
    private ExportProductService exportProductService;

//    /**
//     * 导出PDF（1）入门案例 + 字体处理
//     * http://localhost:8080/cargo/export/exportPdf.do?id=4
//     */
//    @RequestMapping("/exportPdf1")
//    public void exportPdf1() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test01.jasper");
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        // 参数1：jasper文件流
//        // 参数2：通过map集合往模板中填充数据
//        // 参数3：通过数据源往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, new HashMap<>(), new JREmptyDataSource());
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }
//
//
//    /**
//     * 导出PDF（2）填充数据 A map集合
//     */
//    @RequestMapping("/exportPdf2")
//    public void exportPdf2() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test03_parameter.jasper");
//
//        // 创建map集合，通过map集合往jasper模板中填充数据。
//        // 注意：map的key与模板中的Parameter参数名称一致
//        Map<String, Object> map = new HashMap<>();
//        map.put("userName","Java大神");
//        map.put("email","dashen@export.com");
//        map.put("deptName","核心研发部");
//        map.put("companyName","阿里巴巴");
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, map, new JREmptyDataSource());
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }
//
//
//
//    /**
//     * 导出PDF（3）填充数据 B 数据源 - JDBC
//     */
//    @Autowired
//    private DataSource dataSource;
//
//    @RequestMapping("/exportPdf3")
//    public void exportPdf3() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test04_jdbc.jasper");
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, null, dataSource.getConnection());
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }
//
//    /**
//     * 导出PDF（4）填充数据 B 数据源 - javabean
//     */
//    @RequestMapping("/exportPdf4")
//    public void exportPdf4() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test05_javabean.jasper");
//
//        // 构建集合
//        // 方式1： 注意User对象的属性与Field名称一致
//        //List<User> list = new ArrayList<>();
//
//        // 方式2： 注意map的key要与模板中的Field名称一致
//        List<Map<String,Object>> list = new ArrayList<>();
//        for (int i = 0; i < 5; i++) {
//            Map<String, Object> map = new HashMap<>();
//            map.put("userName","Java大神");
//            map.put("email","dashen@export.com");
//            map.put("deptName","核心研发部");
//            map.put("companyName","阿里巴巴");
//            // map添加到集合：map的key要与模板中的Field名称一致
//            list.add(map);
//        }
//
//        // 创建数据源对象，封装javabean集合
//        JRDataSource dataSource = new JRBeanCollectionDataSource(list);
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, null, dataSource);
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }
//
//    /**
//     * 导出PDF（5）分组报表
//     */
//    @RequestMapping("/exportPdf5")
//    public void exportPdf5() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test06_group.jasper");
//
//        // 构建集合
//        List<User> list = new ArrayList<>();
//        for (int j = 0; j < 2; j++) {
//            for (int i = 0; i < 5; i++) {
//                User user = new User();
//                user.setUserName("Java大神" + i);
//                user.setEmail("dashen@export.com");
//                user.setDeptName("核心研发部");
//                user.setCompanyName("阿里巴巴" + j);
//                list.add(user);
//            }
//        }
//
//        // 创建数据源对象，封装javabean集合
//        JRDataSource dataSource = new JRBeanCollectionDataSource(list);
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, null, dataSource);
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }
//
//    /**
//     * 导出PDF（6）导出pdf中包含图表
//     */
//    @RequestMapping("/exportPdf6")
//    public void exportPdf6() throws Exception {
//        // 1. 获取jasper文件流
//        InputStream in =
//                session.getServletContext()
//                        .getResourceAsStream("/jasper/test07_chart.jasper");
//
//        // 构建集合
//        List<Map<String,Object>> list = new ArrayList<>();
//        for (int j = 0; j < 5; j++) {
//            Map<String,Object> map = new HashMap<>();
//            map.put("title","福耀玻璃厂" + j);
//            map.put("value",new Random().nextInt(100));
//            list.add(map);
//        }
//
//        // 创建数据源对象，封装javabean集合
//        JRDataSource dataSource = new JRBeanCollectionDataSource(list);
//
//        // 2. 创建JasperPrint对象，用于往模板中填充数据
//        JasperPrint jasperPrint =
//                JasperFillManager.fillReport(in, null, dataSource);
//        // 3.导出PDF
//        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//    }




    /**
     * 报运单详情的PDF导出
     * http://localhost:8080/cargo/export/exportPdf.do?id=4
     */
    @RequestMapping("/exportPdf")
    public void exportPdf(String id) throws Exception {
        // 1. 获取jasper文件流
        InputStream in =
                session.getServletContext()
                        .getResourceAsStream("/jasper/export.jasper");

        /*准备数据*/
        //A. 根据报运单id，查询报运单对象
        Export export = exportService.findById(id);

        //B. 把报运单对象转换为Map集合。要求：map的key与对象的属性一致。
        Map<String,Object> map = BeanMapUtils.beanToMap(export);

        //C. 根据报运单id，查询商品
        ExportProductExample example = new ExportProductExample();
        example.createCriteria().andExportIdEqualTo(id);
        List<ExportProduct> list = exportProductService.findAll(example);

        // 构造数据源对象，封装商品信息
        JRDataSource dataSource = new JRBeanCollectionDataSource(list);


        // 设置响应的类型、编码、浏览器打开文件的编码
        response.setContentType("application/pdf;charset=UTF-8");
        // 设置下载响应头
        response.setHeader("content-disposition","attachment;fileName=export.pdf");
        // 获取response输出流
        OutputStream out = response.getOutputStream();


        // 2. 创建JasperPrint对象，用于往模板中填充数据
        JasperPrint jasperPrint =
                JasperFillManager.fillReport(in, map, dataSource);
        // 3.导出PDF、下载
        JasperExportManager.exportReportToPdfStream(jasperPrint, out);

        // 关闭 (记得关闭)
        out.close();
    }

}
